package com.czh.hash;

import java.util.ArrayList;
import java.util.List;

/**
 * 哈希表操作
 *
 * @author chenzhihua
 * @Date 2024/2/20
 */
public class BaseoperateHash {
    public static void main(String[] args) {
        // 1.基于数组实现的哈希表
        ArrayHash();
        // 2. 简单实现哈希算法
        hashAlgo("a");
        hashAlgo("c");
        hashAlgo("cc");
        hashAlgo("aa");
    }

    // 基于数组实现的哈希表
    public static void ArrayHash() {
        //1. 初始话
        ArrayHash arrayHash = new ArrayHash(10);
        //2. 添加操作
        arrayHash.put(0, "0");
        arrayHash.put(1, "1");
        arrayHash.put(12, "2");
        arrayHash.put(1113, "3");
        arrayHash.put(5, "5");
        arrayHash.put(4, "4");
        System.out.println("添加后的hash表:");
        arrayHash.traverse();
        // 3. 删除操作
        arrayHash.remove(12);
        arrayHash.remove(444);
        System.out.println("删除后的hash表:");
        arrayHash.traverse();
    }

    // 2. 简单实现哈希算法
    public static void hashAlgo(String key) {
        long hash = 0;
        final int MODULUS = 1000000007;
        // 加法哈希: 对输入的每一个字符进行ASCII码相加，并和最大质数取整数
        for (char c : key.toCharArray()) {
            hash = (hash + (int) c) % MODULUS;
        }
        System.out.println("加法哈希后的值是:" + (int) hash);
        // 乘法哈希: 在加法的基础上乘一个31
        for (char c : key.toCharArray()) {
            hash = (31 * hash + (int) c) % MODULUS;
        }
        System.out.println("乘法哈希后的值是:" + (int) hash);
        // 异或哈希: 对每一个字符进行异或，最后结果和最大质数取整数
        for (char c : key.toCharArray()) {
            hash ^= (int) c;
        }
        System.out.println("异或哈希后的值是:" + (int) hash % MODULUS);
    }
}

/* 键值对 */
class Pair {
    public int key;
    public String val;

    public Pair(int key, String val) {
        this.key = key;
        this.val = val;
    }
}

// 基于数组实现的哈希表
class ArrayHash {
    List<Pair> buckets = new ArrayList<>();

    public ArrayHash(int size) {
        for (int i = 0; i < size; i++) {
            buckets.add(null);
        }
    }

    public int size() {
        return buckets.size();
    }

    /**
     * hash函数的简单实现
     *
     * @param key
     * @return
     */
    public int hashFunction(int key) {
        return key % size();
    }

    /* 查询操作 */
    public Pair get(int key) {
        return buckets.get(hashFunction(key));
    }

    /* 添加操作 */
    public void put(int key, String val) {
        Pair pair = new Pair(key, val);
        buckets.set(hashFunction(key), pair);
    }

    /* 删除操作 */
    public void remove(int key) {
        buckets.set(hashFunction(key), null);
    }

    /* 获取所有键值对 */
    public void traverse() {
        for (Pair bucket : buckets) {
            if (bucket == null) continue;
            System.out.println(bucket.key + "->" + bucket.val);
        }
    }
}